package Models;

import java.util.List;

import Export.CodeStorageContext;
import Interfaces.IDBItem;
import Interfaces.TagType;

public class Tag implements IDBItem {
	
	static String deleteString = "DELETE FROM" + CodeStorageContext.TagTable + " OUTPUT DELETED.IDTag WHERE IDTag=";
	public static final String selectTag = "SELECT [IDTag], [IDAplikace], [Typ], [Hodnota] FROM "+ CodeStorageContext.TagTable +" WHERE ";
	public static final String selectTagList = "SELECT [IDTag], [IDAplikace], [Typ], [Hodnota] FROM "+ CodeStorageContext.TagTable;
	
	int idTag, idAplikace;
	boolean isNew, isModified;
	
	TagType typTagu;
	String hodnota;
	Aplikace masterObject;
	
	public Tag(int idAplikace, TagType typTagu, String hodnota){
		this.idAplikace = idAplikace;
		this.typTagu = typTagu;
		this.hodnota = hodnota;
		
		isNew = true;
	}

	public Tag(Aplikace masterObject, TagType typTagu, String hodnota){
		this.masterObject = masterObject;
		this.idAplikace = masterObject.idAplikace;
		this.typTagu = typTagu;
		this.hodnota = hodnota;
		
		isNew = true;
	}

	public Tag(int idTag, int idAplikace, TagType typTagu, String hodnota){
		this.idAplikace = idAplikace;
		this.typTagu = typTagu;
		this.hodnota = hodnota;
		this.idTag = idTag;
		
		isNew = false;
		isModified = true;
	}

	public Tag(int idTag, Aplikace masterObject, TagType typTagu, String hodnota){
		this.masterObject = masterObject;
		this.idAplikace = masterObject.idAplikace;
		this.typTagu = typTagu;
		this.hodnota = hodnota;
		this.idTag = idTag;
		
		isNew = false;
		isModified = true;
		
	}	
	
	public TagType GetTagType(){
		return typTagu;
	}
	
	public void SetTagType(TagType typTagu){
		if(typTagu != this.typTagu){
			this.typTagu= typTagu; 
			isModified = true;
		}
	}
	
	public String GetHodnota(){
		return hodnota;
	}
	
	public void SetHodnota(String hodnota){
		if(hodnota.compareTo(this.hodnota) != 0){
			this.hodnota = hodnota;
			isModified = true;
		}
	}
	
	public boolean isModified() {
		return isModified;	
	}

	public boolean isNew() {
		return isNew;
	}

	public int getID() {
		return idTag;
	}

	public void setID(int id) {
		idTag = id;
		isNew = false;
		isModified = false;
	}

	public int  getMasterObjectID(){
		return idAplikace;
	}	
		
	public IDBItem getMasterObject() {
		return masterObject;
	}

	public void setMasterObject(IDBItem masterObject) {
		this.masterObject = (Aplikace) masterObject;
		idAplikace = this.masterObject.idAplikace;
	}

	public List<IDBItem> getChilds() {
		return null;
	}
	
	public void setChilds(List<IDBItem> childs) {}	

	public String saveParams() {
		StringBuilder sb = new StringBuilder();
		if(isNew){			
			sb.append("INSERT INTO ");
			sb.append(CodeStorageContext.TagTable);
			sb.append(" ([IDAplikace],[Typ],[Hodnota])");
			sb.append(" OUTPUT INSERTED.IDTag");
			sb.append(" VALUES (");
			sb.append(idAplikace + ", ");
			sb.append(typTagu.ordinal() + ", ");
			sb.append("'" + hodnota +"'");
			sb.append(")");
			return sb.toString();
		}
		else{
			if(isModified){
				sb.append("UPDATE ");
				sb.append(CodeStorageContext.TagTable);
				sb.append(" SET");
				sb.append(" [IDAplikace]=");
				sb.append(idAplikace + ", ");
				sb.append("[Typ]=");
				sb.append(typTagu.ordinal() + ", " );
				sb.append("[Hodnota]=");
				sb.append("'" + hodnota + "'" );
				sb.append(" OUTPUT INSERTED.IDTag");
				sb.append(" WHERE [IDTag]=");
				sb.append(idTag);
				return sb.toString();
			}
		}
		return null;
	}

	public String deleteParams() {
		if(!isNew)
			return deleteString + idTag;
		return null;
	}

}
